﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Collections;
using System.Collections.Specialized;

namespace EntLibEC.Shopping.Payment
{
    /// <summary>
    /// 功能：付完款后跳转的页面（返回页）
    /// 版本：3.0
    /// 日期：2010-06-09
    /// 说明：
    /// 以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己网站的需要，按照技术文档编写,并非一定要使用该代码。
    /// 该代码仅供学习和研究支付宝接口使用，只是提供一个参考。
    /// 
    /// ///////////////////////页面功能说明///////////////////////
    /// 该页面可在本机电脑测试
    /// 该页面称作“返回页”，是由支付宝服务器同步调用，可当作是支付完成后的提示信息页，如“您的某某某订单，多少金额已支付成功”。
    /// 可放入HTML等美化页面的代码和订单交易完成后的数据库更新程序代码
    /// 该页面可以使用ASP.NET开发工具调试，也可以使用写文本函数Log_result进行调试，该函数已被默认关闭
    /// TRADE_FINISHED(表示交易已经成功结束，为普通即时到帐的交易状态成功标识);
    /// TRADE_SUCCESS(表示交易已经成功结束，为高级即时到帐的交易状态成功标识);
    /// </summary>
    public partial class return_url : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            ArrayList sArrary = GetRequestGet();
            ///////////////////////以下参数是需要设置的相关配置参数，设置后不会更改的//////////////////////
            string partner = "";                //合作身份者ID
            string key = "";    //安全检验码
            string input_charset = "gb2312";                    //字符编码格式 目前支持 gb2312 或 utf-8
            string sign_type = "MD5";                           //加密方式 不需修改
            string transport = "https";                         //访问模式,根据自己的服务器是否支持ssl访问，若支持请选择https；若不支持请选择http
            //////////////////////////////////////////////////////////////////////////////////////////////

            if (sArrary.Count > 0)//判断是否有带返回参数
            {
                AlipayNotify aliNotify = new AlipayNotify(sArrary, Request.QueryString["notify_id"], partner, key, input_charset, sign_type, transport);
                string responseTxt = aliNotify.ResponseTxt; //获取远程服务器ATN结果，验证是否是支付宝服务器发来的请求
                string sign = Request.QueryString["sign"];  //获取支付宝反馈回来的sign结果
                string mysign = aliNotify.Mysign;           //获取通知返回后计算后（验证）的加密结果

                //写日志记录（若要调试，请取消下面两行注释）
                //string sWord = "responseTxt=" + responseTxt + "\n return_url_log:sign=" + Request.QueryString["sign"] + "&mysign=" + mysign + "\n return回来的参数：" + AlipayFunction.Create_linkstring(sArrary);
                //AlipayFunction.log_result(Server.MapPath("log/" + DateTime.Now.ToString().Replace(":", "")) + ".txt",sWord);

                //判断responsetTxt是否为ture，生成的签名结果mysign与获得的签名结果sign是否一致
                //responsetTxt的结果不是true，与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
                //mysign与sign不等，与安全校验码、请求时的参数格式（如：带自定义参数等）、编码格式有关
                if (responseTxt == "true" && sign == mysign)//验证成功
                {
                    //获取支付宝的通知返回参数
                    string trade_no = Request.QueryString["trade_no"];      //支付宝交易号
                    string order_no = Request.QueryString["out_trade_no"];	//获取订单号
                    string total_fee = Request.QueryString["total_fee"];	//获取总金额
                    string subject = Request.QueryString["subject"];        //商品名称、订单名称
                    string body = Request.QueryString["body"];              //商品描述、订单备注、描述
                    string buyer_email = Request.QueryString["buyer_email"];//买家支付宝账号
                    string trade_status = Request.QueryString["trade_status"];//交易状态
                    int sOld_trade_status = 0;							    //获取商户数据库中查询得到该笔交易当前的交易状态

                    //打印页面
                    lbTrade_no.Text = trade_no;
                    lbOut_trade_no.Text = order_no;
                    lbTotal_fee.Text = total_fee;
                    lbSubject.Text = subject;
                    lbBody.Text = body;
                    lbBuyer_email.Text = buyer_email;
                    lbTrade_status.Text = trade_status;
                    lbVerify.Text = "验证成功";

                    //假设：
                    //sOld_trade_status="0"	表示订单未处理；
                    //sOld_trade_status="1"	表示交易成功（TRADE_FINISHED/TRADE_SUCCESS）

                    if (Request.QueryString["trade_status"] == "TRADE_FINISHED" || Request.QueryString["trade_status"] == "TRADE_SUCCESS")
                    {
                        //为了保证不被重复调用，或重复执行数据库更新程序，请判断该笔交易状态是否是订单未处理状态
                        if (sOld_trade_status < 1)
                        {
                            //根据订单号更新订单，把订单状态处理成交易成功
                        }
                    }
                    else
                    {
                        Response.Write("trade_status=" + Request.QueryString["trade_status"]);
                    }
                }
                else//验证失败
                {
                    lbVerify.Text = "验证失败";
                }
            }
            else
            {
                lbVerify.Text = "无返回参数";
            }
        }

        /// <summary>
        /// 获取支付宝GET过来通知消息，并以“参数名=参数值”的形式组成数组
        /// </summary>
        /// <returns>request回来的信息组成的数组</returns>
        public ArrayList GetRequestGet()
        {
            int i = 0;
            ArrayList sArray = new ArrayList();
            NameValueCollection coll;
            //Load Form variables into NameValueCollection variable.
            coll = Request.QueryString;

            // Get names of all forms into a string array.
            String[] requestItem = coll.AllKeys;

            for (i = 0; i < requestItem.Length; i++)
            {
                sArray.Add(requestItem[i] + "=" + Request.QueryString[requestItem[i]]);
            }

            return sArray;
        }
    }
}
